package blog.spring.db.service;

import java.util.List;
import java.util.Map;

import blog.core.exception.FormParamErrorException;
import blog.core.exception.NotFoundException;

public interface IBaseService<T> {
	/**
	 * 插入一个实体
	 *
	 * @param entity
	 *            要插入的对象
	 * @throws FormParamErrorException
	 */
	public void save(T entity) throws FormParamErrorException;

	/**
	 * 删除一个实体
	 *
	 * @param entity
	 *            要删除的对象(持久化)
	 */
	public void remove(T entity);

	/**
	 * 更新一个实体
	 *
	 * @param entity
	 *            要更新的对象(持久化)
	 * @throws FormParamErrorException
	 * @throws NotFoundException
	 */
	public void update(T entity) throws FormParamErrorException,
			NotFoundException;

	/**
	 * 根据ID查询实体
	 *
	 * @param id
	 *            编号
	 * @return 查询到的实体对象
	 * @throws NotFoundException
	 */
	public T findById(int id) throws NotFoundException;

	/**
	 * 根据name查询实体
	 *
	 * @param name
	 *            代表name属性的值
	 * @return 实体对象
	 */
	public T findByName(String name);

	/**
	 * 查询是否存在同名实体
	 *
	 * @param name
	 *            name或者表示name的唯一性属性的值
	 * @return 存在返回true，不存在返回false
	 */
	public boolean findByNameIsExist(String name);

	/**
	 * 分页查询
	 *
	 * @param pageNum
	 *            页码
	 * @param pageSize
	 *            显示数量
	 * @param name
	 *            排序名称(如果不排序则为空)
	 * @param sort
	 *            排序方式(asc/desc)
	 * @return 查询到的结果列表
	 */
	public List<T> findList(Integer pageNum, Integer pageSize, String name,
			String sort);

	/**
	 * 分页搜索
	 *
	 * @param conditions
	 *            键值对条件集合
	 * @param pageNum
	 *            页码
	 * @param pageSize
	 *            显示数量
	 * @param name
	 *            排序名称(如果不排序则为空)
	 * @param sort
	 *            排序方式(asc/desc)
	 * @param islike
	 *            是否模糊搜索
	 * @return 搜索到的结果列表
	 */
	public List<T> searchList(Map<String, Object> conditions, Integer pageNum,
			Integer pageSize, String name, String sort, Boolean islike);

	/**
	 * 单个对象搜索(在不确定是否搜索结果只有一个时不建议使用此方法)
	 *
	 * @param conditions
	 *            键值对条件集合
	 * @param islike
	 *            是否模糊搜索
	 * @return 返回结果中的第一个对象
	 */
	public T searchUnique(Map<String, Object> conditions, Boolean islike);

	/**
	 * 查询全部对象
	 * @return
	 */
	List<T> findAll();
}
